#ifndef __w25qxx_H
#define __w25qxx_H

#include "zos_config.h"

#ifdef BOARD_USING_SPI_FLASH

#include "zos_def.h"
//W25X系列/Q系列芯片列表	   
//W25Q80  ID  0XEF13
//W25Q16  ID  0XEF14
//W25Q32  ID  0XEF15
//W25Q64  ID  0XEF16	
//W25Q128 ID  0XEF17	
//W25Q256 ID  0XEF18


#define W25Q80 	0XEF13 	
#define W25Q16 	0XEF14
#define W25Q32 	0XEF15
#define W25Q64 	0XEF16
#define W25Q128	0XEF17
#define W25Q256 0XEF18

extern zos_uint16_t w25qxx_TYPE;					//定义w25qxx芯片型号	   

////////////////////////////////////////////////////////////////////////////////// 
//指令表
#define W25X_WriteEnable		0x06 
#define W25X_WriteDisable		0x04 
#define W25X_ReadStatusReg1		0x05 
#define W25X_ReadStatusReg2		0x35 
#define W25X_ReadStatusReg3		0x15 
#define W25X_WriteStatusReg1    0x01 
#define W25X_WriteStatusReg2    0x31 
#define W25X_WriteStatusReg3    0x11 
#define W25X_ReadData			0x03 
#define W25X_FastReadData		0x0B 
#define W25X_FastReadDual		0x3B 
#define W25X_PageProgram		0x02 
#define W25X_BlockErase			0xD8 
#define W25X_SectorErase		0x20 
#define W25X_ChipErase			0xC7 
#define W25X_PowerDown			0xB9 
#define W25X_ReleasePowerDown	0xAB 
#define W25X_DeviceID			0xAB 
#define W25X_ManufactDeviceID	0x90 
#define W25X_JedecDeviceID		0x9F 
#define W25X_Enable4ByteAddr    0xB7
#define W25X_Exit4ByteAddr      0xE9


//4Kbytes为一个Sector
//16个扇区为1个Block
//W25Q256
//容量为32M字节,共有512个Block,8192个Sector 
													 
//初始化SPI FLASH的IO口
void w25qxx_init(void);

//读取芯片ID
//返回值如下:				   
//0XEF13,表示芯片型号为W25Q80  
//0XEF14,表示芯片型号为W25Q16    
//0XEF15,表示芯片型号为W25Q32  
//0XEF16,表示芯片型号为W25Q64 
//0XEF17,表示芯片型号为W25Q128 	  
//0XEF18,表示芯片型号为W25Q256
zos_uint16_t  w25qxx_read_ID(void);  	    		//读取FLASH ID

//读取w25qxx的状态寄存器，w25qxx一共有3个状态寄存器
//状态寄存器1：
//BIT7  6   5   4   3   2   1   0
//SPR   RV  TB BP2 BP1 BP0 WEL BUSY
//SPR:默认0,状态寄存器保护位,配合WP使用
//TB,BP2,BP1,BP0:FLASH区域写保护设置
//WEL:写使能锁定
//BUSY:忙标记位(1,忙;0,空闲)
//默认:0x00
//状态寄存器2：
//BIT7  6   5   4   3   2   1   0
//SUS   CMP LB3 LB2 LB1 (R) QE  SRP1
//状态寄存器3：
//BIT7      6    5    4   3   2   1   0
//HOLD/RST  DRV1 DRV0 (R) (R) WPS ADP ADS
//regno:状态寄存器号，范:1~3
//返回值:状态寄存器值
zos_uint8_t w25qxx_read_SR(zos_uint8_t regno);             //读取状态寄存器 

//写w25qxx状态寄存器
void w25qxx_write_SR(zos_uint8_t regno,zos_uint8_t sr);   //写状态寄存器

//w25qxx写使能	
//将WEL置位   
void w25qxx_write_enable(void);  		//写使能 

//w25qxx写禁止	
//将WEL清零  
void w25qxx_write_disable(void);		//写保护

//无检验写SPI FLASH 
//必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
//具有自动换页功能 
//在指定地址开始写入指定长度的数据,但是要确保地址不越界!
//write_addr:开始写入的地址(24bit)
//write_buf:数据存储区
//write_len:要写入的字节数(最大65535)
//CHECK OK
void w25qxx_write_no_check(zos_uint32_t write_addr,zos_uint8_t *write_buf,zos_uint16_t write_len);

//读取SPI FLASH  
//在指定地址开始读取指定长度的数据
//read_addr:开始读取的地址(24bit)
//read_buf:数据存储区
//read_len:要读取的字节数(最大65535)
void w25qxx_read(zos_uint32_t read_addr,zos_uint8_t* read_buf,zos_uint16_t read_len);   //读取flash

//写SPI FLASH  
//在指定地址开始写入指定长度的数据
//该函数带擦除操作!
//write_addr:开始写入的地址(24bit)		
//write_buf:数据存储区				
//write_len:要写入的字节数(最大65535)   
void w25qxx_write(zos_uint32_t write_addr,zos_uint8_t* write_buf,zos_uint16_t write_len);//写入flash

//擦除整个芯片		  
//等待时间超长...
void w25qxx_erase_chip(void);    	  	//整片擦除

//擦除一个扇区
//dst_addr:扇区地址 根据实际容量设置
//擦除一个扇区的最少时间:150ms
void w25qxx_erase_sector(zos_uint32_t dst_addr);	//扇区擦除

//等待空闲
void w25qxx_wait_busy(void);           	//等待空闲

//进入掉电模式
void w25qxx_power_down(void);        	//进入掉电模式

//唤醒
void w25qxx_wakeup(void);				//唤醒

#endif


#endif


